STAT3 : CORRELATION

Existe-t-il une relation entre deux variables quantitatives X et Y ?

Claude Grasland & Jean-Paul Nguesso

2025-06-01

1. PREPARATION DES DONNEES

1.1. Chargement du tableau principal

On charge notre bon vieux fichier des pays d’Afrique de l’Ouest en 2018

don <- read.table(file = "data/africa_pays_2018/data/africa_ouest_2018.csv", # nom du fichier et chemin d'accès
                  sep = ";",                     # séparateur (ici, des points-virgule)
                  dec=",",                       # Type de décimale
                  header = TRUE,                 # ligne d'en-tête avec le nom des variables
                  encoding="UTF-8")              # encodage adapté au français

head(don)
  iso3           nom  POP  PIB CO2HAB ESPVIE AGEMED MORINF URBANI LOCKED LANGFR
1  BEN         Bénin 11.6 3224   0.62   61.6   18.8   60.5   47.6      0      1
2  BFA  Burkina Faso 20.0 2161   0.20   61.4   17.6   49.0   29.7      1      1
3  CIV Côte d'Ivoire 25.4 5134   0.33   57.6   18.9   59.4   51.0      0      1
4  GHA         Ghana 30.1 5304   0.61   63.9   21.5   34.9   56.4      0      0
5  GIN        Guinée 12.6 2531   0.26   61.4   18.0   64.9   36.3      0      1
6  GMB        Gambie  2.3 2176   0.27   61.9   17.8   39.0   61.6      0      0

1.2 Choix des deux variables à analyser

En dehors de iso3 et nom, on ne garde que deux variables que l’on renomme X et Y avec colnames() et que l’on convertit en type numérique général. Il suffira par la suite de modifier le choix des variables X et Y pour faire d’autres analyses.

sel<-don[,c("iso3","nom","PIB","CO2HAB")]
colnames(sel)<-c("CODE","NOM","X","Y")
head(sel)
  CODE           NOM    X    Y
1  BEN         Bénin 3224 0.62
2  BFA  Burkina Faso 2161 0.20
3  CIV Côte d'Ivoire 5134 0.33
4  GHA         Ghana 5304 0.61
5  GIN        Guinée 2531 0.26
6  GMB        Gambie 2176 0.27

1.3 On est malin …

Mais comme on ne sait plus ce que sont X et Y, on le précise avec des chaînes de caractères qu’on pourra utiliser dans les graphiques. Et on peut préparer une version multilangue …

# Pour la version française
fr_titre <- "Les pays d'Afrique de l'Ouest en 2018"
fr_nomX <- "PIB en $/hab."
fr_nomY <- "Emissions de CO2 en t./hab"
fr_auteur <- "Ecole d'été AfromapR, Bouaké 2025"
# Pour la version anglaise
en_titre <- "Countries from Western Africa in1988"
en_nomX <- "GDP in $/hab."
en_nomY <- "CO2 emissions (t./hab.)"
en_auteur <- "Summer School AfromapR, Bouaké 2025"

2. EXPLORATION VISUELLE

2.1 Visualisation avec plot(X,Y)

La manière la plus simple d’analyser la relation entre X et Y est d’utiliser un simple plot

plot(sel$X,sel$Y)

2.1 Visualisation avec plot(X,Y)

La fonction plot() comporte de nombreux paramètres permettant d’améliorer le graphique et de l’habiller. Voici un exemple d’habillage

plot(sel$X,sel$Y,
     main = fr_titre,   # titre
     cex.main = 1,      # police du titre
     sub = fr_auteur,   # sous-titre
     cex.sub = 0.6,     # police du sous-titre
     xlab = fr_nomX,    # nom de l'axe X
     xlim = c(1000,6000),   # intervalle de l'axe X
     ylab = fr_nomY,    # nom de l'axe Y
     ylim = c(0,0.9),    # intervalle de l'axe Y
     cex.axis = 0.8,    # police des gradations d'axes
     cex.lab = 0.8,     # police des noms d'axes
     cex = 0.6,         # taille des symboles
     col = "blue")       # couleur des symboles

2.1 Visualisation avec plot(X,Y)

2.2 Identification des points avec text(…)

On peut ajouter au graphique généré par plot(X,Y) une couche de labels avec text(X,Y,Code). On précise la position avec pos =, la taille de police avex cex = et la couleur avec col =.

plot(sel$X,sel$Y,
     main = fr_titre,   # titre
     cex.main = 1,      # police du titre
     sub = fr_auteur,   # sous-titre
     cex.sub = 0.6,     # police du sous-titre
     xlab = fr_nomX,    # nom de l'axe X
     xlim = c(1000,6000),   # intervalle de l'axe X
     ylab = fr_nomY,    # nom de l'axe Y
     ylim = c(0,0.9),    # intervalle de l'axe Y
     cex.axis = 0.8,    # police des gradations d'axes
     cex.lab = 0.8,     # police des noms d'axes
     cex = 0.6,         # taille des symboles
     col = "blue")       # couleur des symboles
text(x = sel$X,
     y = sel$Y,
     label = sel$CODE,
     cex = 0.7,
     pos=3,
     col = "blue")

2.2 Identification des points avec text(…)

On peut ajouter au graphique généré par plot(X,Y) une couche de labels avec text(X,Y,Code). On précise la position avec pos =, la taille de police avex cex = et la couleur avec col =.

2.3 Ajout de lignes horizontales ou verticales avec abline(…)

On peut rajouter à un graphique des lignes horizontales ou verticales avec abline en précisant leur position avec h= ou v=, leur épaisseur avec lwd = , leur style avec lty= et leur couleur avec col=. On peut également ajouter la droite de régression linéaire Y = aX+b comme on le verra au chapitre suivant.

plot(sel$X,sel$Y,
     main = fr_titre,   # titre
     cex.main = 1,      # police du titre
     sub = fr_auteur,   # sous-titre
     cex.sub = 0.6,     # police du sous-titre
     xlab = fr_nomX,    # nom de l'axe X
     xlim = c(1000,6000),   # intervalle de l'axe X
     ylab = fr_nomY,    # nom de l'axe Y
     ylim = c(0,0.9),    # intervalle de l'axe Y
     cex.axis = 0.8,    # police des gradations d'axes
     cex.lab = 0.8,     # police des noms d'axes
     cex = 0.6,         # taille des symboles
     col = "blue")       # couleur des symboles

text(x = sel$X,
     y = sel$Y,
     label = sel$CODE,
     cex = 0.6,
     pos=3,
     col = "blue")


# Ajout d'une ligne horizontale  correspondant à la moyenne de Y
abline(h=mean(sel$Y),col="red",lwd = 1, lty = 2)
# Ajout d'une ligne verticlae  correspondant à la moyenne de X
abline(v=mean(sel$X),col="red",lwd = 1, lty = 2)

2.3 Ajout de lignes horizontales ou verticales avec abline(…)

2.4 Interprétation du diagramme

Que vous apprend ce diagramme ? Quelles hypothèses permet-il de formuler ?

3. CORRELATION LINEAIRE

3.1 Définitions : relation linéaire/monotone/complexe

  • il existe une relation linéaire entre deux variables quantitatives X et Y si l’on peut prédire leurs valeurs respectives par les fonctions Y = a1.X + b1 et X = a2.X = b2

  • il existe une relation monotone entre deux variables quantitatives X et Y si l’on peut prédire les valeurs Y en fonction de celle de X far une fonction Y=f(X) qui est strictement croissante ou strictement décroissante.

  • il existe une relation complexe entre deux variables quantitatives X et Y si l’on peut prédire les valeurs Y en fonction de celle de X par une fonction Y=f(X) qui comporte au moins un point minimum ou maximum de changement de pente (annulation de la dérivée première)

3.1 Définitions : relation linéaire/monotone/complexe

3.1 Définitions : relation positive/négative/nulle

  • Une relation linéaire ou monotone est positive si à un accroissement de X correspond un accroissement de Y

  • Une relation linéaire ou monotone est négative si à un accroissement de X correspond une diminution de Y

  • une relation est nulle si une variation de X n’entraine pas de variation de Y

3.1 Définitions : relation positive/négative/nulle

3.1 Définitions : relation forte/faible/nulle

  • Une relation linéaire est forte si une valeur de X permet de prédire la valeur de Y avec une faible marge d’erreur.

  • Une relation linéaire ou monotone est faible si une valeur de X permet de prédire la valeur de Y avec une forte marge d’erreur.

  • une relation linéaire est nulle si une valeur de X ne permet aucunement de prédire la valeur de Y

3.1 Définitions : relation forte/faible/nulle

3.1 Définitions : relation significative/non siginificative

  • Une relation linéaire est significative si l’effectif permettant de la mettre en évidence est suffisamment grand pour qu’on puisse exclure qu’elle soit l’effet du hasard.

  • Une relation linéaire ou monotone est non significative si l’effectif permettant de la mettre en évidence n’est pas suffisamment grand pour qu’on puisse exclure qu’elle soit l’effet du hasard.

  • On considère traditionnellement qu’une relation est significative s’il y a moins de 5% de chances qu’elle soit l’effet du hasard (p-value < 0.05).

3.1 Définitions : relation significative/non siginificative

3.2 la fonction cor() : objectif

  • La fonction cor() permet de mesurer le coefficient de corrélation de deux variable X et Y.
  • Elle permet de détecter les relations linéaires en choisissant le paramètre (par défaut) method = pearson
  • Elle permet de détecter les relations non linéaires en choisissant le paramètre method = spearman qui mesure l’existence d’une relation monotone entre les rangs de X et Y

3.2 la fonction cor() : syntaxe

  • La syntaxe de la fonction cor() est très simple et permet de calculer trois types de corrélation. La méthode par défaut est pearson c’est-à-dire le coefficient de corrélation linéaire
cor(sel$X,sel$Y)
[1] 0.6937868
cor(sel$X,sel$Y, method = "spearman")
[1] 0.6964286
cor(sel$X,sel$Y, method = "kendall")
[1] 0.5238095

3.2 cor() permet de savoir si la relation est linéaire ou monotone

3.2 cor() permet de repérer l’effet d’une valeur exceptionnelle

3.2 cor() permet de savoir si la relation est positive ou négative

3.2 cor() permet de avoir si la relation est forte ou faible

3.3. la fonction cor.test() : objectif

  • la fonction cor() permet de savoir si une relation est forte ou faible, positive ou négative, linéaire ou non linéaire. Mais **cor() ne permet pas de savoir si une relation est significative ou pas.

  • C’est la fonction cor.test() qui permet de tester la significativité d’une relation en fournissant un intervalle de confiance du coefficient de corrélation et une probabilité de rejet de H0 : il n’y a pas de relation appelée en anglais la p-value.

  • p-value > 0.10 : relation non significative

  • 0.10 > p-value > 0.05 : relation presque significative

  • p-value < 0.05 : relation significative

  • p-value < 0.01 : relation très significative

3.3. la fonction cor.test() : application au coefficient de Pearson

Même syntaxe que cor() :

cor.test(sel$Y,sel$X)

    Pearson's product-moment correlation

data:  sel$Y and sel$X
t = 3.4734, df = 13, p-value = 0.004119
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.2816077 0.8898101
sample estimates:
      cor 
0.6937868 

3.3. la fonction cor.test() : application au coefficient de Spearman

Même syntaxe que cor() :

cor.test(sel$Y,sel$X, method="spearman")

    Spearman's rank correlation rho

data:  sel$Y and sel$X
S = 170, p-value = 0.005177
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.6964286 

3.4 Intensité et significativité

  • Le carré du coefficient de corrélation appelé r-square ou r2 permet de mesurer le pouvoir explicatif de X par rapport à Y. Il ne dépend pas du nombre d’observations.
  • le test de significativité ou p-value mesure la significativité de la relation c’est-à-dire le fait que la relation entre X et Y ne soit pas l’effet du hasard. Il dépend à la fois du niveau de corrélation et du nombre d’observations.

3.4 Intensité et significativité

  • A gauche : une relation forte mais non significative
  • A droite : une relation faible mais très significative

3.5 Conclusion : que pensez vous de la relation CO2 / PIB ?

  • positive ou négative ?
  • forte ou faible ?
  • linéaire ou non linéaire
  • significative ou non siognificative ?

4. ANALYSE D’UNE MATRICE DE CORRELATION (Supplément facultatif)

Objectif de l’analyse

  • Soit un ensemble de variables quantitatives continues \((X_1...X_i...X_k)\) décrivant les mêmes individus.

  • On se propose de construire la matrice \(R_{ij}[1...i...k ; 1...j...k]\) indiquant pour chaque paire de variable \(ij\) leur coefficient de corrélation (linéaire ou de rang)

  • Puis de construire la matrice \(p_{ij}[1...i...k ; 1...j...k]\) indiquant pour chaque paire de variable \(ij\) la probabilité H0 d’absence de relation, c’est-à-dire le degré de significativité de la corrélation.

Utilisation des résultats

  1. Mettre en évidence des groupes de variables significativement corrélées entre elles, que ce soit de façon positive ou négative.

  2. Préparer la réalisation d’une analyse en composantes principales qui regroupera les variables corrélées entre elles en facteurs.

  3. Identifier des variables non redondantes pour construire un modèle de régression multiple.

  4. Indentifier des variables fortement corrélées pouvant servir de proxy pour estimer des valeurs manquantes dans un tableau

Visualisation d’une matrice de corrélation

_ Sous la forme de tableaux montrant si possible à la fois les coefficients de corrélation et les seuils de significativité.

  • Sous la forme de graphes montrant de façon visuelle l’intesité, le signe et la significativité des relations.

  • Sous la forme de plans factoriels résultant d’une analyse en composantes principales.

Chacun de ces objectifs supposant en général l’emploi de packages spécialisés.

Exemple : création d’un tableau quantitatif

On ne sélectionne que des variables quantitatives et on ajoute les noms des pays en attribut des lignes afin de former une matrice.

tab<-don[,c(4:9)]
row.names(tab)<-don$iso3
head(tab,3)
     PIB CO2HAB ESPVIE AGEMED MORINF URBANI
BEN 3224   0.62   61.6   18.8   60.5   47.6
BFA 2161   0.20   61.4   17.6   49.0   29.7
CIV 5134   0.33   57.6   18.9   59.4   51.0

Utilisation de la fonction cor()

On applique la fonction cor()

mat_cor<-cor(tab)

On affiche la matrice de corrélation en arrondissant les valeurs

round(mat_cor,3)
          PIB CO2HAB ESPVIE AGEMED MORINF URBANI
PIB     1.000  0.694  0.013  0.481 -0.010  0.541
CO2HAB  0.694  1.000  0.388  0.519 -0.263  0.542
ESPVIE  0.013  0.388  1.000  0.144 -0.821  0.076
AGEMED  0.481  0.519  0.144  1.000 -0.136  0.657
MORINF -0.010 -0.263 -0.821 -0.136  1.000 -0.135
URBANI  0.541  0.542  0.076  0.657 -0.135  1.000

Utilisation du package psych

La fonction cor.test() de Rbase ne permet pas de calculer les corrélations pour toute une matrice. Aussi on charge le package psych qui dispose d’une fonction corr.test() beaucoup plus puissante qui crée plusieurs matrices de résultats

library(psych)
results<-psych::corr.test(tab)
names(results)
 [1] "r"      "n"      "t"      "p"      "p.adj"  "se"     "sef"    "adjust"
 [9] "sym"    "ci"     "ci2"    "ci.adj" "stars"  "Call"  

Utilisation du package psych

On retrouve la matrice des coefficiences de corrélation

round(results$r,3)
          PIB CO2HAB ESPVIE AGEMED MORINF URBANI
PIB     1.000  0.694  0.013  0.481 -0.010  0.541
CO2HAB  0.694  1.000  0.388  0.519 -0.263  0.542
ESPVIE  0.013  0.388  1.000  0.144 -0.821  0.076
AGEMED  0.481  0.519  0.144  1.000 -0.136  0.657
MORINF -0.010 -0.263 -0.821 -0.136  1.000 -0.135
URBANI  0.541  0.542  0.076  0.657 -0.135  1.000

Utilisation du package psych

Mais aussi la matrice des tests de significativité

round(results$p,3)
         PIB CO2HAB ESPVIE AGEMED MORINF URBANI
PIB    0.000  0.058  1.000  0.626  1.000  0.444
CO2HAB 0.004  0.000  1.000  0.472  1.000  0.444
ESPVIE 0.963  0.153  0.000  1.000  0.003  1.000
AGEMED 0.070  0.047  0.610  0.000  1.000  0.101
MORINF 0.971  0.344  0.000  0.629  0.000  1.000
URBANI 0.037  0.037  0.788  0.008  0.631  0.000

Utilisation du package psych

On peut aussi faire une jolie matrice colorée avec des tests de signficativité sous forme d’étoiles

corPlot(tab, stars=TRUE, diag=FALSE)

Utilisation du package factoMineR

Si on veut voir les axes factoriels d’une analyse en composante principales on utilise la fonction PCA() de FactoMineR

library(FactoMineR)
monacp<-PCA(tab, graph=FALSE)

On pourra ensuite visualiser la corrélation des variables avec les principaux axes factoriels et les coordonnées des individus sur ceux-ci.

Corrélation des variables avec les axes factoriels

plot.PCA(monacp,choix = "varcor")

Coordonnées des individus sur les axes factoriels

plot.PCA(monacp,choix = "ind",)